package JavaCode.random_records.N901_1000;

import java.util.LinkedList;
import java.util.Queue;

/**
 * author:fangjie
 * time:2020/3/3
 */
public class N994_rotting_oranges {
    public int orangesRotting(int[][] grid) {
        int sum=0;
        Queue<int[]> queue=new LinkedList<>();
        for (int i=0;i<grid.length;i++)
        {
            for (int j=0;j<grid[0].length;j++)
            {
                if(grid[i][j]==2)queue.add(new int[]{i,j});
                else if(grid[i][j]==1)sum++;
            }
        }
        int res=0;
        if(sum==0)return 0;
        while (!queue.isEmpty())
        {
            int size=queue.size();
            res++;
            while (size-->0)
            {
                int[] cur=queue.poll();
                for (int[] n:NEXTS)
                {
                    int i=cur[0]+n[0];
                    int j=cur[1]+n[1];
                    if(i<0||j<0||i>=grid.length||j>=grid[0].length||grid[i][j]!=1)continue;
                    if(--sum==0)return res;
                    grid[i][j]=2;
                    queue.add(new int[]{i,j});
                }
            }
        }
        return -1;
    }
    private final static int[][] NEXTS={{-1,0},{0,-1},{0,1},{1,0}};
}
/*
在给定的网格中，每个单元格可以有以下三个值之一：

值 0 代表空单元格；
值 1 代表新鲜橘子；
值 2 代表腐烂的橘子。
每分钟，任何与腐烂的橘子（在 4 个正方向上）相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能，返回 -1。

 

示例 1：



输入：[[2,1,1],[1,1,0],[0,1,1]]
输出：4
示例 2：

输入：[[2,1,1],[0,1,1],[1,0,1]]
输出：-1
解释：左下角的橘子（第 2 行， 第 0 列）永远不会腐烂，因为腐烂只会发生在 4 个正向上。
示例 3：

输入：[[0,2]]
输出：0
解释：因为 0 分钟时已经没有新鲜橘子了，所以答案就是 0 。
 

提示：

1 <= grid.length <= 10
1 <= grid[0].length <= 10
grid[i][j] 仅为 0、1 或 2

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/rotting-oranges
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
